AbstractTutorial subclass: #MyTutorial instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'ProfStef'. MyTutorial compile: 'handling ^ Lesson title: ''Smalltalk kezelés alapok'' lesson: ''"Smalltalk-ban minden dinamikusan történik. Üzeneteket küldünk a dinamikusan létezö objektumoknak, ezzel kiváltva különféle viselkedést. Üzenetküldés végrehajtásához Pharo-ban a jobb gombos menü Do It menüpontja szolgál." Browser open. "Az üzenet értékének kiíratására is beépítettek egy egyszerü módszert: jobb klikk, Print It (Crtl + P)" 3+4. "Pl a következö oldalra lépéshez jelöld ki a következö sort, jobb klikk és Do It menüpont (vagy Crtl + D)" ProfStef next.''' classified: 'lessons'. MyTutorial compile: 'lexical1 ^ Lesson title: ''A Smalltalk lexikális elemei 1'' lesson: ''"A Smalltalk lexikális elemei" "Whitespace karakterek és kommentek" "Whitespace: megszokott karakterek + komment kommentek: "..." " "Nem az egyetlen nyelv ami így használja a megjegyzést! pl. angol nyelv" sum := 3 + 4. "This is a comment.". product := "This is another comment" 3 * 4. "Azonosítók" "x, door3, the_end, privateNam" "Konstansok" nil. " UndefinedObject egyetlen példányára referencia" false. true. "Pszeudó változók rendszer-definiált változók, csak a futtatókörnyezet éri el öket" self. super. thisContext. "(bizonyos környezetekben, pl. VisualWorks)" ProfStef next.''' classified: 'lessons'. MyTutorial compile: 'lexical2 ^ Lesson title: ''A Smalltalk lexikális elemei 2'' lesson: ''"A Smalltalk lexikális elemei 2" "Kulcsszavak" "Azonosító, amit : követ x: door3: the_end: _privateMessage:" "Bináris szelektor karakterek" "operator tokens, bináris metódusokhoz" "~ ! @ % & * - + = | \ < > , ? /" "Szimbólum literál" "Symbol osztály példánya (örököl Collection-böl) gyakorlatilag egy állandó értékü String hash (#) után: azonosító (#x), kulcsszó (#at:put:) bináris szelektorok (#<=), String (#''''This'''')" "array-ben használva String kivételével hash elhagyható" ProfStef next.''' classified: 'lessons'. MyTutorial compile: 'lexical3 ^ Lesson title: ''A Smalltalk lexikális elemei 3'' lesson: ''"A Smalltalk lexikális elemei 3" "Integer" 42. -451. "(más számrendszerbeli megadás)" 2r101. 8r70. 16rFF. "Print-tel tesztelhetö a 10-es számrendszerre való konverzió értéke" "ScaledDecimal" 1.0s1. 99.99s2. "Floating Point" 3.14. 3.14q1. 31.4 "(quad precision)" 1e100. -3.1415d1. "(double prec.)" 31415.92q-4. "Character" $x $# $ $$ "String (Collection of Characters)" ''''x'''' ''''Smalltalk doesn''''''''t use a double-quote to felimit a string literal'''' ProfStef next.''' classified: 'lessons'. MyTutorial compile: 'array ^ Lesson title: ''Array'' lesson: ''"Tömbök" "Array: bármilyen értékek egybefoglalása (akár különbözö osztályúakat is!) #(értékek) ByteArray: csak unsigned integer értékek 0-255 között #[értékek]" #[2 4 8 16 32] #[2 4 8 16 32] #(22 ''''hello'''' 3.14 nil #value $x) #() "Üres tömb" #(''''hello'''' world) "''''hello'''' sztring és world szimbólum (elhagyott #)" #((''''hello'''' ''''world'''') #(hello world)) "Belsö # elhagyható" #(true false) "így a true, false Boolean értékeket jelentik" #(#true #false) "így szombólumokat" ProfStef next.''' classified: 'lessons'. MyTutorial compile: 'codeblock ^ Lesson title: ''Code Blocks'' lesson: ''"Kódblokkok" "Érték, mely egy névtelen funkciót reprezentál, amely meghívódik a kódblokknak küldött üzenet hatására Mivel minden objektum: változónak értékül adható, argumentumként szerepelhet, visszatérési érétk lehet" [3 + 4, 1+2] [1 * 2 * 3 * 4 * 5] value [] value. "értékük az utolsó expression/statement értéke v nil (üres)" "Argumentumokkal is rendelkezhet $: karakter és egy azonosítóval jelölve" [:x | x * x] [:a :b | a < b] [:x :m :b | m * x + b] "A formális blokk argumentumok nem változók!" "Könnyü Lambda-kalkulus átírás.. vagy akár megszokott nyelvekhez is hasonlóság" "[:x | x * x] ~ Lambda x. (x * x) ~ function f(x) is {return x * x;}" ProfStef next.''' classified: 'lessons'. MyTutorial compile: 'messages1 ^ Lesson title: ''Üzenetek 1'' lesson: ''"Üzenetek" "Üzenetküldés 3 komponensböl áll: objektum, aminek az üzenet megy = reveiver üzenet szelektora (üzenet egyedi azonosítója) argumentumok" "Binary Messages:" "Nem operátorok! (jel. nem meghat. szintaxis által) kivéve: #== #~~ (memóriaterületi egyenlöség) pl.: 7 + 3 * 2 eredménye 20, nem 17 Bármely osztályhoz hozzáadható bináris szelektorú metódus (standardhoz is)" 3 - 4. "Receiver = 3 Selector = #- Argument = 4 => -1" ''''con'''', ''''cat'''' "Receiver = ''''con'''' Selector = #, Argument = ''''cat'''' => ''''concat'''' " "Unary Messages:" "Argumentum nélküli üzenet csak fogadó, szelektor megadása" 9 sqrt. ''''hello'''' size. ''''72'''' asNumber. 72 printString. (3 > 4) not. #(2 $y 3.14d) class. #(2 $y 3.14d) copy. ProfStef next.''' classified: 'lessons'. MyTutorial compile: 'messages2 ^ Lesson title: ''Üzenetek 2'' lesson: ''"Üzenetek 2" "Keyword Messages:" "Egy vagy több argumentumú üzenet, szelektor itt kulcsszavak sorozata" 12 quo: 5. "Receiver = 12 Selector = #quo: Argument = 5 => 2" "aView displayOn: aWindow at: aPoint" "Receiver = aView Selector = #displayOn:at: Arguments = (aWindow, aPoint) " "DateAndTime year: 2008 month: 9 day: 17" "Receiver = DateAndTime Selector=#year:month:day Arguments = (2008, 9, 17) => 2008-09-17" "Precedencia: unary, binary, keyword" "Cascaded messages: azonos fogadónak üzenetek $;-vel elválasztva küldhetök" Date today addDays: 10; addMonths: 1; yourself. 10 May 2012 "System Browser nyilvántartja mely osztályokhoz mely üzenetek hívhatók meg és milyen hatással rendelkeznek" Browser open. "Olvashatóság: aString.substring(2, 5) <==> aString copyFrom: 2 to: 4 aPoint.nearestPointOnLine(p1, p2) <==> aPoint nearestPointOnLineFrom: p1 to: p2 new ColorValue(a, b, c) <==> ColorValue hue: a saturation: b value: c aFont.display(s, n, m, p, gc) <==> aFont displayString: s from: n to: m at: p on: gc new DateAndTime(a, b, c) <==> DateAndTime year: a day: b timeZone: c" ProfStef next.''' classified: 'lessons'. MyTutorial compile: 'expr ^ Lesson title: ''Kifejezések'' lesson: ''"Kifejezések, állítások Smalltalk-ban" "Kifejezés = expression" "Végrehajtható kód egy része, mely kiértékelhetö. Egymásba ágyazhatóak. Literal: 3.14 Variable or Argument Reference: anArray Pseudo-variable Reference: self Constant Reference: nil Message Send (or Cascade): 456 factorial Nested Expression: (''''hello'''' at: 1) (matrix at: rowIndex) at: columnIndex" "Állítás = statement" "Opcionálisan egy vagy több értékadással kezdödö expression Értékadás operátor :=" "next := (prev := next) parent (elöbb next értéke prev-nek majd next parent értéke adódik next-nek Szekvenciális megadás: Elválasztó jel: $. (pont karakter) Metódus visszatérési operátor ^ filename := ''''document.txt'''' asFilename. stream := filename readStream. string := stream upToEnd. stream close. ^string asCollectionOfLines" "Blokk hívások: #value unáris üzenet küldése a blokknak" "argumentum nélkül:" [3 + 4] value. "1-3 argumentum:" [:a :b | a < b] value: 3 value: 4 "=> 3 < 4 => true" "4- argumentum: " [:y :mo :d :h :mi :s | DateAndTime year: y month: mo day: d hour: h minute: mi second: s] valueWithArguments: #(2007 9 22 8 0 0). ProfStef next.''' classified: 'lessons'. MyTutorial compile: 'controlstruct ^ Lesson title: ''Vezérlési szerkezetek'' lesson: ''"Nincsenek a nyelvben elöre elöállított szerkezetek, programozó magának alakíthatja ki" "If..then.." a:=1. b:=10. a < b ifTrue: [b - a]. "Fontos megjegyezni, hogy itt például az ifTrue: szelektorú üzenet a True vagy False objektumoknak küldött üzenetet jelent. Így az objektumok egyértelműen tudják melyik ág végrehajtását kell visszaadniuk visszatéréskor." "If..then..else.." a:=20. b:=10. a < b ifTrue: [b - a] ifFalse: [a - b]. "Loop N times" Transcript open. 3 timesRepeat: [Transcript show: ''''Hello world''''; cr] "For..by.. loop" "initialIndex to: finalIndex by: stepValue do: oneArgumentBlock" Transcript open. n:=10. 1 to: n by: 2 do: [ :i | Transcript show: i asString] "Többi hasonlóképp: ""Repeat while" conditionBlock whileTrue "Repeat until" conditionBlock whileFalse: inductionBlock "Until..do.. loop" conditionBlock whileFalse: inductionBlock " "Boolean operátorok megvalósítása: lazy és= expression and: block lazy vagy= expression or: block expression & expression expression | expression kizáró vagy: expression xor: expression" true or: [false]. true & true. false | true. false xor: true. "Collections: #do üzenet végrehajtó minden elemre" sum := 0. #(-35 51 6 -192 278) do: [:element | sum := sum + element]. ^sum "További üzenetek (#do-val megvalósíthatók) #select:, #reject:, #collect:, #contains:, #detect:ifNone: #inject:into:" "Példány létrehozás: nincsen konstruktor, üzenetküldéssel példányosítunk #new és #new: üzenetek" Object new. "létrehoz egy új példányt Object osztályból" Array new: 3. String new: 80. "Lokális változók: metóduson, blokkon belül elérhetök deklarációs listában megadva" | maxValue | maxValue := Float infinity negated. #(18 2 64 -99) do: [:element | maxValue := element max: maxValue]. ^maxValue ProfStef next.''' classified: 'lessons'. MyTutorial compile: 'method ^ Lesson title: ''Metódus deklaráció'' lesson: ''"Deklaráció= method header + executable code Executable code= (opc)local variable declaration list sequence of statements A metódus szelektora a header-e által meghatározott header deklarál formális argumentumokat az egyes aktuális argumentumoknak (köthető azonosítóval = nem a lefoglalt 6 azonosító egyik) formális argumentumok nem változók! Figyelem: minden metódus deklaráció külön fordítási egység metódus nincsen osztályhoz kötve (kommentben információk)" "Unary header = unary message selector" value "Answer the value of the receiver''''s instance variable named value." ^value area "Answer the area of the receiver, by multiplying the value of its two instance variables width and height." ^width * height "Binary header = binary message selector + formal method argument" - aSet "Answer the set difference between the receiver and aSet." | setDifference | setDifference := self shallowCopy. aSet do: [:each | setDifference remove: each ifAbsent: []]. ^setDifference "Keyword header = egy vagy több metódus argumentum (kulcsszavak sorozata)" setValue: newValue "Set the value of the receiver''''s instance variable value to be the value of the argument (newValue.)" value := newValue year: year day: dayOfYear hour: hour minute: minute second: second "Anwser a new instance of the receiver (a new instance of DateAndTime) representing the specified date and time-of-day." ^self new setYear: year dayOfYearOrdinal: dayOfYear; setHour: hour minute: minute second: second; canonicalizeFromLocalTime; beImmutable ProfStef next.''' classified: 'lessons'. MyTutorial compile: 'classes ^ Lesson title: ''Osztály definiálás'' lesson: ''"Futási idöben, dinamikusan létezö, létrejövö objektumok ezek is Saját specifikációjukként funkcionálnak Üzenetküldéssel létrehozás - általában a fejlesztö eszköz segít ebben Osztály által specifikált példányváltozó megváltoztatása esetén egyböl az összes példány is változik!" Object subclass: #Point instanceVariableNames: ''''x y'''' classVariableNames: '''' poolDictionaries: '''' category: ''''Graphics-Primitives'''' "fejlesztö környezetnek információ" Point subclass: #ThreeDPoint instanceVariableNames: ''''z'''' classVariableNames: ''''Zero'''' poolDictionaries: ''''TrigConstants'''' category: ''''Graphics-Primitives'''' "Hozzájuk metódus kapcsolása (futtató környezettöl erösen függ pontosna hogyan implementált!) pl:" "ThreeDPoint compile: '''' metódus deklarációja '''' classified: #vmi. " "Vége!"''' classified: 'lessons'. MyTutorial compile: 'tutorial ^ #( #handling #lexical1 #lexical2 #lexical3 #array #codeblock #messages1 #messages2 #expr #controlstruct #method #classes )' classified: 'tutorial'. ProfStef goOn: MyTutorial.